/*
@author: ztt
@file: sanle_shopping.go
@time: 2022/11/20 15:20
*/
package main

import (
	"bufio"
	"encoding/json"
	"fmt"
	"os"
	"strconv"
	"strings"
)
//用户信息
var user = make(map[string]map[string]string)
var usermessage = "user.txt"
var shoppingList = "shopping.txt"

//商品信息
var goods = map[string]map[string]int{
	"1":{"苹果":5}, "2": {"香蕉":3}, "3":{"葡萄":8} , "4":{"榴莲":40}}

//空购物车
var shopping = make(map[string]int)

//结算用的钱
var all = 0

//从文件中读取信息初始化user
func initUser()  {
	content,err := os.ReadFile(usermessage)
	if err != nil {
		fmt.Println("初始化用户信息失败，没有指定文件")
	}else{
		err := json.Unmarshal(content,&user)
		if err != nil{
			fmt.Println("json格式化失败，初始化用户信息失败",err)
		}
	}
}
func initshopping()  {
	content,err := os.ReadFile(shoppingList)
	if err != nil {
		fmt.Println("初始化用户信息失败，没有指定文件")
	}else{
		err := json.Unmarshal(content,&shopping)
		if err != nil{
			fmt.Println("json格式化失败，初始化购物车信息失败",err)
		}
	}
}

func WriteUserInfo(){
	u,_ := json.Marshal(user)
	file,err := os.OpenFile(usermessage,os.O_CREATE|os.O_WRONLY,0666)
	if err != nil {
		fmt.Println("文件打开失败",err)
	}else {
		file.Write(u)
	}
}

func WriteShoppingInfo(){
	s,_ := json.Marshal(shopping)
	file,err := os.OpenFile(shoppingList,os.O_CREATE|os.O_WRONLY|os.O_TRUNC,0666)
	if err != nil {
		fmt.Println("文件打开失败",err)
	}else {
		file.Write(s)
	}
}

func check(keyEnd string,valueEnd int)  {
	for _, value := range goods[keyEnd] {
		sice := valueEnd*value
		all = sice + all
	}
}

func shop(name string,Money string)  {
	_, ok := user[strings.Replace(name, "\n", "", -1)]
	if ok{
		user[strings.Replace(name, "\n", "", -1)]["money"]=Money
	}
	WriteUserInfo()
}

func addCar(g string,num int)  {
	shopping[g] = num
	fmt.Println(shopping)
	fmt.Println("添加成功")
}

func menut()  {
	fmt.Println("编号","名称","价格")
	for key, value := range goods {
		for keys, values := range value {
			fmt.Println(key,keys,values)
		}
	}
}

func menuLog() {
goodloop:
	fmt.Println("1.查看商品信息")
	fmt.Println("2.添加到购物车")
	fmt.Println("3.退出")
	var choice string
	fmt.Println("请输入您的选择")
	_, _ = fmt.Scanln(&choice)
	for {
		if choice == "1" {
			menut()
			goto goodloop
		}
		if choice == "2" {
			var g string
			var num int
			fmt.Println("请选择您要添加的物品")
			fmt.Scan(&g)
			fmt.Println("请选择您要添加的数量")
			fmt.Scan(&num)
			addCar(g,num)
			fmt.Println("是否结算")
			fmt.Println("1.结算")
			fmt.Println("2.不结算")
			var op string
			_, _ = fmt.Scanln(&op)
			if op == "1" {
				for keyEnd, valueEnd := range shopping {
					check(keyEnd, valueEnd)
				}
				fmt.Println("一共是:", all, "元")
				Read := bufio.NewReader(os.Stdin)
				name,_ := Read.ReadString('\n')
				var pm = user[strings.Replace(name, "\n", "", -1)]["money"]
				var Money = 0
				var Moneys = ""
				Money,_ =strconv.Atoi(pm)
				fmt.Println(Money)
				if Money<all {
					fmt.Println("您的余额不足!!")
				}else {
					Money = Money - all
					fmt.Println(Money)
					fmt.Println("结算成功!")
					Moneys = strconv.Itoa(Money)
					shop(name,Moneys)
					fmt.Println(user)
				}
				WriteShoppingInfo()
				goto goodloop
			}
			if op == "2" {
				WriteShoppingInfo()
				goto goodloop
			}
			if choice == "3" {
				break
			}
		}
	}
}


func ln(name string, passwd string) bool{
	_, ok := user[name]
	if ok && user[name]["passwd"] == passwd{
		return true
	} else {
		return false
	}
}

func login()  {

	var name string
	var passwd string
	fmt.Println("请输入用户名")
	_,_ = fmt.Scanln(&name)
	fmt.Println("请输入密码")
	_,_ = fmt.Scanln(&passwd)
	if ln(name,passwd) {
		fmt.Println("登录成功")
		menuLog()
	} else {
		fmt.Println("该用户不存在")
	}
}

func rigist() bool{
	var money  string
	var name string
	var passwd string
	var passwdRe string
	fmt.Println("请输入用户名")
	_,_ = fmt.Scanln(&name)
	_,ok := user[name]
	if ok {
		fmt.Println("用户已存在，请重新输入")
		return false
	}else{
		fmt.Println("请输入密码")
		_,_ = fmt.Scanln(&passwd)
		fmt.Println("请再次输入密码")
		_,_ = fmt.Scanln(&passwdRe)
		if passwdRe == passwd{
			fmt.Println("恭喜您注册成功")
			fmt.Println("请输入金额")
			_,_ = fmt.Scanln(&money)
			var nameMap = map[string]string{
				"passwd":passwd,
				"money":money}
			user[name] = nameMap
			fmt.Println("写入用户信息")
			WriteUserInfo()
		}else {
			fmt.Println("两次密码输入不一致")
		}
	}
	return true
}

func menu()  {
	fmt.Println("请输入你的选择：")
	fmt.Println("1.登录")
	fmt.Println("2.注册")
	fmt.Println("q.退出")
}

func main()  {
	initUser()
	initshopping()
	fmt.Println("欢迎来到购物商城")
OuterLoop:
	for  {
		menu()
		var options string
		_,_ = fmt.Scanln(&options)
		switch  options{
		case "1":login();break

		case "2":rigist()
		case "q":break OuterLoop
		}

	}
}


//func main() {
//	//存放用户信息  {"sc":{"passwd":"123456", "money":"300"}}
//	//var user map[string]map[string]interface{}
//	//存放商品信息
//	// {"F001": {"name":"apple", "price":"9"},
//	//   "F002": {"name":"banana", "price":"3"}}
//	//var products = map[string]map[string]interface{}{
//	//	"F001": {"name":"apple", "price":9},
//	//	"F002": {"name":"banana", "price":3},
//	//	"F003": {"name":"orange", "price":4}}
//	user_file := "user.txt"
//	//执行用户信息初始化函数
//	init_user(user_file)
//
//	fmt.Println("****欢迎进入购物系统*****")
//	fmt.Println("1、登录")
//	fmt.Println("2、注册")
//	for {
//		var op string
//		fmt.Print("请输入你的选择：")
//		fmt.Scan(&op)
//		switch op {
//		case "1":
//			fmt.Print("请输入用户名:")
//			Read := bufio.NewReader(os.Stdin)
//			name, _ := Read.ReadString('\n')
//			fmt.Println("请输入密码:")
//			passRead := bufio.NewReader(os.Stdin)
//			passwd, _ := passRead.ReadString('\n')
//			result := login(name, passwd)
//			if result {
//				fmt.Println("登录成功")
//			}
//
//		case "2":
//			fmt.Print("请输入用户名:")
//			Read := bufio.NewReader(os.Stdin)
//			name, _ := Read.ReadString('\n')
//			fmt.Print("请输入密码:")
//			passRead := bufio.NewReader(os.Stdin)
//			passwd, _ := passRead.ReadString('\n')
//			result := register(name, passwd)
//			fmt.Println(result)
//			if result {
//				fmt.Println(user)
//			}
//		case "q":
//			break
//		}
//	if op == "q"{
//		break
//	}
//	}
//}
//
////从文件中读取信息，初始化user
//func init_user()  {
//	content, err :=os.ReadFile(user_file) //只读方式打开文件
//	if err != nil {
//		fmt.Println("初始化用户信息失败，没有指定文件")
//	}else {
//		err1 :=json.Unmarshal(content,&user)
//		if err1 != nil{
//			fmt.Println("json格式化失败，初始化用户信息失败！")
//		}
//	}
//}
//
//func login(name string, passwd string) bool {
//		return true
//}
//
//func register(name string, passwd string) bool {
//	fmt.Println("register  beginning....")
//	_, ok := user[name]
//	if ok {
//		fmt.Println("用户已存在，请重新输入")
//		return false
//	}else{
//		var money int
//		fmt.Print("请输入你的充值金额：")
//		fmt.Scan(&money)
//		var name_map = map[string]interface{}{
//			"passwd":passwd,
//			"money": money}
//		fmt.Println("***********")
//		user[name] = name_map
//		fmt.Println("将用户信息写入文件")
//		WriteUserInfo()
//		return true
//	}
//}
//
//func WriteUserInfo()  {
//	file, err :=os.OpenFile(user_file,os.O_WRONLY|os.O_CREATE,666)
//	if err !=nil {
//		fmt.Println("写入用户信息失败！")
//	}else {
//		str_m1, _ :=json.Marshal(user)
//		file.Write(str_m1)
//		fmt.Println("写入用户信息成功！")
//	}
//}